// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_AURA_LAYOUT_MANAGER_H_
#define UI_AURA_LAYOUT_MANAGER_H_

#include "ui/aura/aura_export.h"

namespace gfx {
class Rect;
}

namespace aura {
class Window;

// An interface implemented by an object that places child windows.
class AURA_EXPORT LayoutManager {
public:
    LayoutManager();
    virtual ~LayoutManager();

    // Invoked when the window is resized.
    virtual void OnWindowResized() = 0;

    // Invoked when the window |child| has been added.
    virtual void OnWindowAddedToLayout(Window* child) = 0;

    // Invoked prior to removing |window|.
    virtual void OnWillRemoveWindowFromLayout(Window* child) = 0;

    // Invoked after removing |window|.
    virtual void OnWindowRemovedFromLayout(Window* child) = 0;

    // Invoked when the |SetVisible()| is invoked on the window |child|.
    // |visible| is the value supplied to |SetVisible()|. If |visible| is true,
    // window->IsVisible() may still return false. See description in
    // Window::IsVisible() for details.
    virtual void OnChildWindowVisibilityChanged(Window* child, bool visible) = 0;

    // Invoked when |Window::SetBounds| is called on |child|.
    // Implementation must call |SetChildBoundsDirect| to change the
    // |child|'s bounds. LayoutManager may modify |requested_bounds|
    // before applying, or ignore the request.
    virtual void SetChildBounds(Window* child,
        const gfx::Rect& requested_bounds)
        = 0;

protected:
    // Sets the child's bounds forcibly. LayoutManager is responsible
    // for checking the state and make sure the bounds are correctly
    // adjusted.
    void SetChildBoundsDirect(aura::Window* child, const gfx::Rect& bounds);
};

} // namespace aura

#endif // UI_AURA_LAYOUT_MANAGER_H_
